home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl760 / scnp785j.lzh / SURFGEN.BAS < prev    next >
BASIC Source File  |  1991-08-19  |  4KB  |  96 lines

  1. 10 REM  PROGRAM SURFGEN GENERATES VALUES OF A FUNCTION OF TWO VARIABLES.
  2. 20 REM  THE PROGRAM WRITES THE VALUES ALONG WITH PLOT COMMANDS TO A FILE
  3. 30 REM  NAMED SURFDATA.PLT; THE VALUES ARE THEN PLOTTED BY USING THE SHELL
  4. 40 REM  COMMAND TO RUN THE SPLOT PROGRAM.
  5. 50 REM
  6. 80 REM  WARNING: DO NOT RENUMBER!
  7. 90 REM
  8. 100 CLS: KEY OFF
  9. 105 DIM Z.(201), X.(201)
  10. 110 PRINT"This program plots a function of two variables defined by a"
  11. 120 PRINT"subroutine which follows the main program.  The subroutine must"
  12. 130 PRINT"set dependent variable Y equal to a function evaluated at the"
  13. 140 PRINT"current value of the independent variables X and Z."
  14. 150 PRINT
  15. 160 PRINT"List lines 1000-1999 to see current function."
  16. 180 REM
  17. 190 OPEN "SURFDATA.PLT" FOR OUTPUT AS #2
  18. 200 PRINT: LINE INPUT"Title? "; TITLE$: PRINT#2,"TITLE "+TITLE$
  19. 205 PRINT: LINE INPUT"Z-Axis Label? ";LZ$: PRINT#2,"ZLABEL "+LZ$
  20. 215 LINE INPUT"X-Axis Label? ";LX$: PRINT#2,"XLABEL "+LX$
  21. 220 LINE INPUT"Y-Axis Label? ";LY$: PRINT#2,"YLABEL "+LY$
  22. 222 PRINT: INPUT"Log Z-Axis (N/Y)"; A$: A$=LEFT$(A$,1)
  23. 224 IF A$="Y" OR A$="y" THEN PRINT#2,"LOGZ"
  24. 230 INPUT"Log X-Axis (N/Y)"; A$: A$=LEFT$(A$,1)
  25. 240 IF A$="Y" OR A$="y" THEN PRINT#2,"LOGX"
  26. 250 INPUT"Log Y-Axis (N/Y)"; A$: A$=LEFT$(A$,1)
  27. 260 IF A$="Y" OR A$="y" THEN PRINT#2,"LOGY"
  28. 290 REM
  29. 300 PRINT: PRINT"Enter initial value, final value & step size of ";
  30. 305 PRINT"independent variable Z"
  31. 310 INPUT V$: IF V$ <> "" GOTO 320
  32. 315     INPUT"Initial Value, Final Value, Step Size"; V$: IF V$="" GOTO 315
  33. 320   P=1: GOSUB 680: ZI. = V: GOSUB 680: ZF. = V: GOSUB 680: ZS. = V
  34. 325   IF ZS. <= 0 THEN PRINT"ERROR: INVALID STEP SIZE": GOTO 315
  35. 330   NZ. = INT( (ZF.-ZI.)/ZS. + 1.5 )
  36. 335   IF NZ. < 2 THEN PRINT"ERROR: INVALID RANGE": GOTO 315
  37. 340   IF NZ. > 201 THEN PRINT"ERROR: TOO MANY POINTS - MAX OF 201": GOTO 315
  38. 350 PRINT: PRINT"Enter initial value, final value & step size of ";
  39. 355 PRINT"independent variable X"
  40. 360 INPUT V$: IF V$ <> "" GOTO 370
  41. 365     INPUT"Initial Value, Final Value, Step Size"; V$: IF V$="" GOTO 365
  42. 370   P=1: GOSUB 680: XI. = V: GOSUB 680: XF. = V: GOSUB 680: XS. = V
  43. 375   IF XS. <= 0 THEN PRINT"ERROR: INVALID STEP SIZE": GOTO 365
  44. 380   NX. = INT( (XF.-XI.)/XS. + 1.5 )
  45. 385   IF NX. < 2 THEN PRINT"ERROR: INVALID RANGE": GOTO 365
  46. 390   IF NX. > 201 THEN PRINT"ERROR: TOO MANY POINTS - MAX OF 201": GOTO 365
  47. 395 REM
  48. 470 PRINT:PRINT"Calculating ... Please wait ..."
  49. 475 PRINT#2,"READZ ";NZ.
  50. 480 FOR I.=1 TO NX. : X.(I.) = XI. + (I.-1)*XS. : NEXT I.
  51. 482 FOR I.=1 TO NZ. : Z.(I.) = ZI. + (I.-1)*ZS. : PRINT#2, Z.(I.) : NEXT I.
  52. 484 PRINT#2,"READTAB ";NZ.;" ";NX.
  53. 490 FOR I.=1 TO NX.
  54. 500   X = X.(I.)
  55. 505   PRINT#2, X.(I.);
  56. 510   FOR J.=1 TO NZ.
  57. 512     Z = Z.(J.): GOSUB 1100: PRINT#2," ";Y;
  58. 514     IF ( J. AND 3 ) = 0 OR J. = NZ. THEN PRINT#2,""
  59. 516   NEXT J.
  60. 520 NEXT I.
  61. 545 PRINT#2,"PLOT3D"; : IF NZ. > 20 THEN PRINT#2," SURFACE";
  62. 546 PRINT#2,"" : PRINT#2,"KEYBOARD"
  63. 550 CLOSE#2
  64. 560 REM
  65. 570 PRINT:PRINT"Press the ENTER key to display the plot";
  66. 580 PRINT" - press the ESC key to clear the plot."
  67. 590 A$=INKEY$: IF A$<>"" GOTO 590
  68. 600 A$=INKEY$: IF A$="" GOTO 600
  69. 610 IF ASC(A$)<>13 GOTO 600
  70. 620 SHELL( "SPLOT SURFDATA.PLT" )
  71. 630 END
  72. 670 REM EXTRACTS V FROM V$ STARTING AT POSITION P
  73. 680 P2=LEN(V$)
  74. 690 IF MID$(V$,P,1)=" " AND P<=P2 THEN P=P+1: GOTO 690
  75. 700 P0=P: IF P0>P2 THEN V=0: RETURN
  76. 710 IF MID$(V$,P,1)<>" " AND P<=P2 THEN P=P+1: GOTO 710
  77. 720 V = VAL( MID$( V$, P0, P-P0 ) )
  78. 730 RETURN
  79. 1000 REM
  80. 1010 REM NOTE: To avoid conflict with main program variables,
  81. 1020 REM       do not use variable names that contain a period.
  82. 1030 REM
  83. 1100 REM Subroutine must set variable Y = function(X,Z) after this line #
  84. 1110 REM Insert here GOTO 1210 to plot another functions
  85. 1120 REM Let X and Z vary from -12.5 to 12.5 with a step of .5 or .25
  86. 1130 R = SQR( X*X + Z*Z ): GOSUB 1160: Y = S
  87. 1140 RETURN
  88. 1150 REM S = SINC( R )
  89. 1160 IF R <> 0 THEN S = SIN(R) / R ELSE S = 1
  90. 1170 RETURN
  91. 1200 REM Let X and Z vary from -90 to +90 with a step of 6 or 3
  92. 1210 R = 9 * SIN( 1.745329E-02 * Z ): GOSUB 1160: YZ = S
  93. 1220 R = 6 * SIN( 1.745329E-02 * X ): GOSUB 1160: YX = S
  94. 1230 Y = YZ * YX
  95. 1240 RETURN
  96.